第一台要納管的是 Windows 檔案伺服器。我在自己的電腦執行遠端查詢,畫面卻只回了一串連線失敗:有時是 WinRM 沒開,有時是權限不足,也可能是 TrustedHosts 或防火牆擋住。原本以為寫好 PowerShell 指令就能收資料,真正花時間的卻是先打通這條遠端通道。
我把目標端初始化整理成 scripts/Setup-WinRMTarget.ps1,希望每台主機都用一樣的步驟設定。collectors.py 的 winrm_client_needs_setup 與 prepare_winrm 則幫忙檢查監控端;collect_winrm 收到資料後再轉成共用格式。
最大的收穫是:只要某件事會做第二次,就值得寫成腳本。機台變多時,這會救你很多時間。
def initialize_winrm_client(hosts, execute=run_command):
targets = winrm_host_targets(hosts)
if not winrm_client_needs_setup(targets, execute):
return
execute(winrm_setup_script(targets))
首次設定被整理成可重複流程,不再完全依賴人工操作與記憶。
execute 以參數傳入,測試時可以換成假的執行器,不必真的變更開發電腦的 WinRM 設定。
hosts = [{
"type": "winrm",
"host": "192.0.2.10",
"username": "monitor",
}]
initialize_winrm_client(hosts)
snapshot = collect_winrm(hosts[0])
print(snapshot["status"], snapshot["disks"])
實際執行前要先在測試環境確認權限與防火牆;初始化函式會修改監控端的 WinRM 設定。
WinRM 最麻煩的 Bug 是「在某台電腦可用,換一台就失敗」。常見原因包含 TrustedHosts 未更新、UAC 遠端限制、服務未啟動或防火牆規則不同。我的修復方式不是一直增加重試,而是先用 winrm_client_needs_setup 判斷監控端狀態,再由 Setup-WinRMTarget.ps1 統一目標端設定。winrm_connection_error 也將 Access denied 等原始訊息轉成具體提示,讓使用者知道應該檢查權限還是網路。
今天我體會到,遠端蒐集最難的往往是建立一致、可重複的設定流程。下一篇會把 Ubuntu 與 Linux 服務機透過 SSH 納入監控。